import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

public class Guy {
	final static int UNTEN=0;
	final static int LINKS=1;
	final static int OBEN=2;
	final static int RECHTS=3;
	
	int PositionX, PositionY, MaxX, MaxY;
	int oldx, oldy;
	int dx, dy; // Gewuenschte Laufrichtung
	Image[][] guyImg;
	int dir=0;
	int animStep=0;
	World world;
	Sprechblase sprechblase=null;
	
	public Guy(World parent, int maxX, int maxY){
		guyImg=new Image[4][4];	// Bilder fuer 4 Animationsschritte in 4 Richtungen
		BufferedImage shapeImage=null;
		try {
			shapeImage=ImageIO.read(new File("typshapes.png"));
		} catch (IOException e) {
			System.out.println("Kann Shapes nicht laden.");
		}
		for (int i=0; i<4; i++)
			for (int j=0; j<4; j++)
				guyImg[i][j]=shapeImage.getSubimage(j*32, i*48, 32, 48);
		MaxX = maxX;
		MaxY = maxY;
		
		this.world=parent;
	}
	
	public void paint(Graphics g, Canvas parent) {
		// Shape malen (Typ geht ist 32x48 Pixel gross, so dass er ueber die Steine geht (sieht cooler aus)
		g.drawImage(guyImg[dir][animStep>>1], PositionX, PositionY-16, parent);
		
		if (sprechblase!=null) 
			sprechblase.paint(g, PositionX, PositionY);
		
		// Typ animieren
		if (oldx!=PositionX || oldy!=PositionY)
			animStep=(animStep+1)%8;
		
		oldx=PositionX;
		oldy=PositionY;
	}
	
	public void say(String text) {
		sprechblase=new Sprechblase(text);
	}
	
	
	public void MoveOben() {
		dir=OBEN;
		dx = 0;
		dy = -8;
	}
	
	public void MoveLinks() {
		dir=LINKS;
		dx = -8;
		dy = 0;
	}
		
	public void MoveRechts() {
		dir=RECHTS;
		dx = 8;
		dy = 0;
	}
		
	public void MoveUnten() {
		dir=UNTEN;
		dx = 0;
		dy = 8;
	}
	
	public void MoveStop() {
		dx = 0;
		dy = 0;
	}
	
	public void clock() {
		int oldx=PositionX;
		int oldy=PositionY;
		PositionX += dx;
		PositionY += dy;
		
		if (dir==UNTEN && dy>0 && (PositionY>>5)<world.currentLevel.hoehe-1) {
			// Kollision nach unten - stehen bleiben, aber nach links/rechts ruecken, wenn daneben ein Durchgang frei ist
			if (!world.tiles[PositionX>>5][(PositionY+31)>>5].stepOn) {
				if (world.tiles[(PositionX+31)>>5][(PositionY+31)>>5].stepOn) {
					PositionX+=8;
				}
				PositionY=oldy;
				dy=0;
			}
			else if (!world.tiles[(PositionX+31)>>5][(PositionY+31)>>5].stepOn) {
				if (world.tiles[PositionX>>5][(PositionY+31)>>5].stepOn) {
					PositionX-=8;
				}
				PositionY=oldy;
				dy=0;
			}		
		}
		if (dir==OBEN && dy<0 && (PositionY>>5)>=0) {
			// Kollision nach oben, sonst genauso wie ^
			if (!world.tiles[PositionX>>5][PositionY>>5].stepOn) {
				if (world.tiles[(PositionX+31)>>5][PositionY>>5].stepOn) {
					PositionX+=8;
				}
				PositionY=oldy;
				dy=0;
			}
			else if (!world.tiles[(PositionX+31)>>5][PositionY>>5].stepOn) {
				if (world.tiles[PositionX>>5][PositionY>>5].stepOn) {
					PositionX-=8;
				}
				PositionY=oldy;
				dy=0;
			}
		}
		if (dir==RECHTS && dx>0 && (PositionX>>5)<world.currentLevel.breite-1) {
			// Kollision nach rechts, sonst genauso wie ^
			if (!world.tiles[(PositionX+31)>>5][PositionY>>5].stepOn) {
				if (world.tiles[(PositionX+31)>>5][(PositionY+31)>>5].stepOn) {
					PositionY+=8;
				}
				PositionX=oldx;
				dx=0;
			}
			else if (!world.tiles[(PositionX+31)>>5][(PositionY+31)>>5].stepOn) {
				if (world.tiles[(PositionX+31)>>5][PositionY>>5].stepOn) {
					PositionY-=8;
				}
				PositionX=oldx;
				dx=0;
			}
		}
		if (dir==LINKS && dx<0 && (PositionX>>5)>=0) {
			// Gaehn!... Aeh, Kollision nach links
			if (!world.tiles[PositionX>>5][PositionY>>5].stepOn) {
				if (world.tiles[PositionX>>5][(PositionY+31)>>5].stepOn) {
					PositionY+=8;
				}
				PositionX=oldx;
				dx=0;
			}
			if (!world.tiles[PositionX>>5][(PositionY+31)>>5].stepOn) {
				if (world.tiles[PositionX>>5][PositionY>>5].stepOn) {
					PositionY-=8;
				}
				PositionX=oldx;
				dx=0;
			}
		}
		
		if (dx!=0 || dy!=0)
			animStep=(animStep+1)%8;

		if (sprechblase!=null) {
			sprechblase.clock();
			if (sprechblase.timer<=0)
				sprechblase=null;
		}
	}
}
